package com.java.jvm.gc;

import java.util.Random;

/**
 * @author wangning
 * @date 2023/5/19 14:50
 * 1.串行垃圾收集器
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC    (DefNew + Tenured)
 * 开启后会使用: Serial(Young区用) + Serial Old(Old区用)的收集器组合
 *
 * 2.并行垃圾收集器
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC    (ParNew + Tenured)
 * 启用ParNew收集器，只影响新生代的收集，不影响老年代开启上述参数后，会使用: ParNewYoung区用)+ Serial Old的收集器组合，新生代使用复制算法，老年代采用标记-整理算法
 * 备注情况: Java HotSpot(TM) 64-Bit Server VM warning:
 * Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release
 * 警告说明 ParNew + Serial Old 组合不推荐使用
 * XX:ParallelGCThreads 限制线程数量，默认开启和CPU数目相同的线程数
 *
 * 3 Parallel Scavenge + UseParallelOldGC
 * -Xms10m -Xmx10m -xx:+PrintGCDetails -Xx:+PrintCommandlineFlags -XX:+UseParallelGC    (PSYoungGen + ParOldGen)
 *
 * 4
 * 4.1
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelOldGC    (PSYoungGen + ParOldGen)
 * 4.2 不加就是默认 UseParallelGC
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags    (PSYoungGen + ParOldGen)
 *
 * 5 -XX:+UseConcMarkSweepGC
 * 开启该参数后，使用ParNew(Young区用)+ CMS(Old区用) + Serial 0ld的收集器组合，Serial 0ld将作为CMS出错的后备收集器
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC    (par new generation + concurrent mark sweep)
 *
 * 6 G1
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseG1GC
 *
 * 7 （理论知道即可，实际中已经被优化掉了，没有了）单线程的老年代的垃圾收集器
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialOldGC
 *
 * 下面是故意繁琐配置，主要是为了学习，一般生产不这么配置
 * 下面是故意警琐配置，主要是为了学习，一般生产不这么配置
 * 下面是故意繁琐配置，主要是为了学习，一般生产不这么配置
 * 没什么意义，关联激活的配置一个就可以了，没必要向以下这么麻烦
 * Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandlineFlags -XX:+UseParallelGC -XX:+UseParallelOldGC    (PSYoungGen + ParOldGen)
 * Xms10m -Xmx10m -Xx:+PrintGCDetails -XX:+PrintCommandlineFlags -Xx:+UseParNewGC -Xx:+UseConcMarkSweepGC    (par new generation + concurrent mark sweep)
 */
public class GCDemo {
    public static void main(String[] args) {
        System.out.println("******GCDemo******");
        try {
            String str = "hello";
            while (true) {
                str += str + new Random().nextInt(77777777) + new Random().nextInt(88888888);
                str.intern();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}
